#include <my_header.h>
#include <string.h>
#define BUF_SIZE 4096

/* Usage: 
 * 先启动服务器，再启动客户机
 * 先关闭客户机，再关闭服务器
 */
int main(int argc, char *argv[]){    
    // 创建Socket对象：IPv4, TCP
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);

    // 设定服务器端口与IP地址
    char *port = "9000";
    char *ip = "192.168.162.128";
    struct sockaddr_in sock;
    sock.sin_family = AF_INET;			// IPv4
    sock.sin_port = htons(atoi(port));		// 端口号（转大端）
    sock.sin_addr.s_addr = inet_addr(ip);	// ip号（转大端）

    // 三次握手
    connect(socket_fd, (struct sockaddr *)&sock, sizeof(sock));
    
    printf("client_v1 line23 : 客户端完成三次握手 \n");

    // 创建缓冲数组
    char sendbuf[BUF_SIZE] = {0};
    char recvbuf[BUF_SIZE] = {0};
    int time_remaining = 10;        // 剩余时间

    while(1){
        // 设置select监听
        fd_set fds;                 // 监听
        FD_ZERO(&fds);              // 初始化
        FD_SET(socket_fd, &fds);      // 监听输入
        FD_SET(STDIN_FILENO, &fds); // 监听标准输出

        // 每次等待10s
        struct timeval tv = {10, 0}; 

        // 显示剩余的时间
        printf("\r等待操作[剩余时间: %d秒] (输入消息或正在等待B的回复)...\r\n  ", time_remaining);
        fflush(stdout);

        // select监听
        int ret = select(socket_fd + 1, &fds, NULL, NULL, &tv); // tv是超时标志

//        if(ret == -1){      // 选择错误处理
//            perror("选择错误");
//            break;
//        }
//        if(ret == 0){  			// 此刻(s)未接受到信息处理
//            time_remaining -= 10;
//            if(time_remaining <= 0){  // 超时处理
//                printf("\n时间用尽，程序退出\n");
//                break;
//            }
//            continue;      		// 未超时，继续循环
//        }

        // 接受键盘输入并写入管道
        if(FD_ISSET(STDIN_FILENO, &fds)){
            bzero(sendbuf, sizeof(sendbuf));
            printf("A input > ");
            fflush(stdout);

            ssize_t input_len = read(STDIN_FILENO, sendbuf, sizeof(sendbuf) - 1);
            if(input_len <= 0) break;
            sendbuf[input_len] = '\0';
            write(socket_fd, sendbuf, input_len);

            time_remaining = 10;
        }
        
        // 从管道读取
        if(FD_ISSET(socket_fd, &fds)){
            bzero(recvbuf, sizeof(recvbuf));
            ssize_t read_count2 = read(socket_fd, recvbuf, sizeof(recvbuf));
            if(read_count2 <= 0) break;

            printf("B send > %s ", recvbuf);
            fflush(stdout);

            time_remaining = 10;
        }
    }

    close(socket_fd);
    return 0;
}
